// wcl_colorlib - portable color library
// Copyright (C) <2007>  Wei Hu <wei.hu.tw@gmail.com>
// 
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//

#include <cassert>

#include "cie.hpp"

namespace wcl_colorlib
{
  namespace Cie
  {
    wcl_uint32 const CIE1931_CMF_1NM_BEGIN_WAVELENGTH = 360;
    wcl_uint32 const CIE1931_CMF_1NM_END_WAVELENGTH = 830;
  
    wcl_double const cie1931_cmf_1nm_table[
      CIE1931_CMF_1NM_END_WAVELENGTH - 
      CIE1931_CMF_1NM_BEGIN_WAVELENGTH + 1
                                           ][3] =
    {
      { 0.000129900000,  0.000003917000,  0.000606100000 },
      { 0.000145847000,  0.000004393581,  0.000680879200 },
      { 0.000163802100,  0.000004929604,  0.000765145600 },
      { 0.000184003700,  0.000005532136,  0.000860012400 },
      { 0.000206690200,  0.000006208245,  0.000966592800 },
      { 0.000232100000,  0.000006965000,  0.001086000000 },
      { 0.000260728000,  0.000007813219,  0.001220586000 },
      { 0.000293075000,  0.000008767336,  0.001372729000 },
      { 0.000329388000,  0.000009839844,  0.001543579000 },
      { 0.000369914000,  0.000011043230,  0.001734286000 },
      { 0.000414900000,  0.000012390000,  0.001946000000 },
      { 0.000464158700,  0.000013886410,  0.002177777000 },
      { 0.000518986000,  0.000015557280,  0.002435809000 },
      { 0.000581854000,  0.000017442960,  0.002731953000 },
      { 0.000655234700,  0.000019583750,  0.003078064000 },
      { 0.000741600000,  0.000022020000,  0.003486000000 },
      { 0.000845029600,  0.000024839650,  0.003975227000 },
      { 0.000964526800,  0.000028041260,  0.004540880000 },
      { 0.001094949000,  0.000031531040,  0.005158320000 },
      { 0.001231154000,  0.000035215210,  0.005802907000 },
      { 0.001368000000,  0.000039000000,  0.006450001000 },
      { 0.001502050000,  0.000042826400,  0.007083216000 },
      { 0.001642328000,  0.000046914600,  0.007745488000 },
      { 0.001802382000,  0.000051589600,  0.008501152000 },
      { 0.001995757000,  0.000057176400,  0.009414544000 },
      { 0.002236000000,  0.000064000000,  0.010549990000 },
      { 0.002535385000,  0.000072344210,  0.011965800000 },
      { 0.002892603000,  0.000082212240,  0.013655870000 },
      { 0.003300829000,  0.000093508160,  0.015588050000 },
      { 0.003753236000,  0.000106136100,  0.017730150000 },
      { 0.004243000000,  0.000120000000,  0.020050010000 },
      { 0.004762389000,  0.000134984000,  0.022511360000 },
      { 0.005330048000,  0.000151492000,  0.025202880000 },
      { 0.005978712000,  0.000170208000,  0.028279720000 },
      { 0.006741117000,  0.000191816000,  0.031897040000 },
      { 0.007650000000,  0.000217000000,  0.036210000000 },
      { 0.008751373000,  0.000246906700,  0.041437710000 },
      { 0.010028880000,  0.000281240000,  0.047503720000 },
      { 0.011421700000,  0.000318520000,  0.054119880000 },
      { 0.012869010000,  0.000357266700,  0.060998030000 },
      { 0.014310000000,  0.000396000000,  0.067850010000 },
      { 0.015704430000,  0.000433714700,  0.074486320000 },
      { 0.017147440000,  0.000473024000,  0.081361560000 },
      { 0.018781220000,  0.000517876000,  0.089153640000 },
      { 0.020748010000,  0.000572218700,  0.098540480000 },
      { 0.023190000000,  0.000640000000,  0.110200000000 },
      { 0.026207360000,  0.000724560000,  0.124613300000 },
      { 0.029782480000,  0.000825500000,  0.141701700000 },
      { 0.033880920000,  0.000941160000,  0.161303500000 },
      { 0.038468240000,  0.001069880000,  0.183256800000 },
      { 0.043510000000,  0.001210000000,  0.207400000000 },
      { 0.048995600000,  0.001362091000,  0.233692100000 },
      { 0.055022600000,  0.001530752000,  0.262611400000 },
      { 0.061718800000,  0.001720368000,  0.294774600000 },
      { 0.069212000000,  0.001935323000,  0.330798500000 },
      { 0.077630000000,  0.002180000000,  0.371300000000 },
      { 0.086958110000,  0.002454800000,  0.416209100000 },
      { 0.097176720000,  0.002764000000,  0.465464200000 },
      { 0.108406300000,  0.003117800000,  0.519694800000 },
      { 0.120767200000,  0.003526400000,  0.579530300000 },
      { 0.134380000000,  0.004000000000,  0.645600000000 },
      { 0.149358200000,  0.004546240000,  0.718483800000 },
      { 0.165395700000,  0.005159320000,  0.796713300000 },
      { 0.181983100000,  0.005829280000,  0.877845900000 },
      { 0.198611000000,  0.006546160000,  0.959439000000 },
      { 0.214770000000,  0.007300000000,  1.039050100000 },
      { 0.230186800000,  0.008086507000,  1.115367300000 },
      { 0.244879700000,  0.008908720000,  1.188497100000 },
      { 0.258777300000,  0.009767680000,  1.258123300000 },
      { 0.271807900000,  0.010664430000,  1.323929600000 },
      { 0.283900000000,  0.011600000000,  1.385600000000 },
      { 0.294943800000,  0.012573170000,  1.442635200000 },
      { 0.304896500000,  0.013582720000,  1.494803500000 },
      { 0.313787300000,  0.014629680000,  1.542190300000 },
      { 0.321645400000,  0.015715090000,  1.584880700000 },
      { 0.328500000000,  0.016840000000,  1.622960000000 },
      { 0.334351300000,  0.018007360000,  1.656404800000 },
      { 0.339210100000,  0.019214480000,  1.685295900000 },
      { 0.343121300000,  0.020453920000,  1.709874500000 },
      { 0.346129600000,  0.021718240000,  1.730382100000 },
      { 0.348280000000,  0.023000000000,  1.747060000000 },
      { 0.349599900000,  0.024294610000,  1.760044600000 },
      { 0.350147400000,  0.025610240000,  1.769623300000 },
      { 0.350013000000,  0.026958570000,  1.776263700000 },
      { 0.349287000000,  0.028351250000,  1.780433400000 },
      { 0.348060000000,  0.029800000000,  1.782600000000 },
      { 0.346373300000,  0.031310830000,  1.782968200000 },
      { 0.344262400000,  0.032883680000,  1.781699800000 },
      { 0.341808800000,  0.034521120000,  1.779198200000 },
      { 0.339094100000,  0.036225710000,  1.775867100000 },
      { 0.336200000000,  0.038000000000,  1.772110000000 },
      { 0.333197700000,  0.039846670000,  1.768258900000 },
      { 0.330041100000,  0.041768000000,  1.764039000000 },
      { 0.326635700000,  0.043766000000,  1.758943800000 },
      { 0.322886800000,  0.045842670000,  1.752466300000 },
      { 0.318700000000,  0.048000000000,  1.744100000000 },
      { 0.314025100000,  0.050243680000,  1.733559500000 },
      { 0.308884000000,  0.052573040000,  1.720858100000 },
      { 0.303290400000,  0.054980560000,  1.705936900000 },
      { 0.297257900000,  0.057458720000,  1.688737200000 },
      { 0.290800000000,  0.060000000000,  1.669200000000 },
      { 0.283970100000,  0.062601970000,  1.647528700000 },
      { 0.276721400000,  0.065277520000,  1.623412700000 },
      { 0.268917800000,  0.068042080000,  1.596022300000 },
      { 0.260422700000,  0.070911090000,  1.564528000000 },
      { 0.251100000000,  0.073900000000,  1.528100000000 },
      { 0.240847500000,  0.077016000000,  1.486111400000 },
      { 0.229851200000,  0.080266400000,  1.439521500000 },
      { 0.218407200000,  0.083666800000,  1.389879900000 },
      { 0.206811500000,  0.087232800000,  1.338736200000 },
      { 0.195360000000,  0.090980000000,  1.287640000000 },
      { 0.184213600000,  0.094917550000,  1.237422300000 },
      { 0.173327300000,  0.099045840000,  1.187824300000 },
      { 0.162688100000,  0.103367400000,  1.138761100000 },
      { 0.152283300000,  0.107884600000,  1.090148000000 },
      { 0.142100000000,  0.112600000000,  1.041900000000 },
      { 0.132178600000,  0.117532000000,  0.994197600000 },
      { 0.122569600000,  0.122674400000,  0.947347300000 },
      { 0.113275200000,  0.127992800000,  0.901453100000 },
      { 0.104297900000,  0.133452800000,  0.856619300000 },
      { 0.095640000000,  0.139020000000,  0.812950100000 },
      { 0.087299550000,  0.144676400000,  0.770517300000 },
      { 0.079308040000,  0.150469300000,  0.729444800000 },
      { 0.071717760000,  0.156461900000,  0.689913600000 },
      { 0.064580990000,  0.162717700000,  0.652104900000 },
      { 0.057950010000,  0.169300000000,  0.616200000000 },
      { 0.051862110000,  0.176243100000,  0.582328600000 },
      { 0.046281520000,  0.183558100000,  0.550416200000 },
      { 0.041150880000,  0.191273500000,  0.520337600000 },
      { 0.036412830000,  0.199418000000,  0.491967300000 },
      { 0.032010000000,  0.208020000000,  0.465180000000 },
      { 0.027917200000,  0.217119900000,  0.439924600000 },
      { 0.024144400000,  0.226734500000,  0.416183600000 },
      { 0.020687000000,  0.236857100000,  0.393882200000 },
      { 0.017540400000,  0.247481200000,  0.372945900000 },
      { 0.014700000000,  0.258600000000,  0.353300000000 },
      { 0.012161790000,  0.270184900000,  0.334857800000 },
      { 0.009919960000,  0.282293900000,  0.317552100000 },
      { 0.007967240000,  0.295050500000,  0.301337500000 },
      { 0.006296346000,  0.308578000000,  0.286168600000 },
      { 0.004900000000,  0.323000000000,  0.272000000000 },
      { 0.003777173000,  0.338402100000,  0.258817100000 },
      { 0.002945320000,  0.354685800000,  0.246483800000 },
      { 0.002424880000,  0.371698600000,  0.234771800000 },
      { 0.002236293000,  0.389287500000,  0.223453300000 },
      { 0.002400000000,  0.407300000000,  0.212300000000 },
      { 0.002925520000,  0.425629900000,  0.201169200000 },
      { 0.003836560000,  0.444309600000,  0.190119600000 },
      { 0.005174840000,  0.463394400000,  0.179225400000 },
      { 0.006982080000,  0.482939500000,  0.168560800000 },
      { 0.009300000000,  0.503000000000,  0.158200000000 },
      { 0.012149490000,  0.523569300000,  0.148138300000 },
      { 0.015535880000,  0.544512000000,  0.138375800000 },
      { 0.019477520000,  0.565690000000,  0.128994200000 },
      { 0.023992770000,  0.586965300000,  0.120075100000 },
      { 0.029100000000,  0.608200000000,  0.111700000000 },
      { 0.034814850000,  0.629345600000,  0.103904800000 },
      { 0.041120160000,  0.650306800000,  0.096667480000 },
      { 0.047985040000,  0.670875200000,  0.089982720000 },
      { 0.055378610000,  0.690842400000,  0.083845310000 },
      { 0.063270000000,  0.710000000000,  0.078249990000 },
      { 0.071635010000,  0.728185200000,  0.073208990000 },
      { 0.080462240000,  0.745463600000,  0.068678160000 },
      { 0.089739960000,  0.761969400000,  0.064567840000 },
      { 0.099456450000,  0.777836800000,  0.060788350000 },
      { 0.109600000000,  0.793200000000,  0.057250010000 },
      { 0.120167400000,  0.808110400000,  0.053904350000 },
      { 0.131114500000,  0.822496200000,  0.050746640000 },
      { 0.142367900000,  0.836306800000,  0.047752760000 },
      { 0.153854200000,  0.849491600000,  0.044898590000 },
      { 0.165500000000,  0.862000000000,  0.042160000000 },
      { 0.177257100000,  0.873810800000,  0.039507280000 },
      { 0.189140000000,  0.884962400000,  0.036935640000 },
      { 0.201169400000,  0.895493600000,  0.034458360000 },
      { 0.213365800000,  0.905443200000,  0.032088720000 },
      { 0.225749900000,  0.914850100000,  0.029840000000 },
      { 0.238320900000,  0.923734800000,  0.027711810000 },
      { 0.251066800000,  0.932092400000,  0.025694440000 },
      { 0.263992200000,  0.939922600000,  0.023787160000 },
      { 0.277101700000,  0.947225200000,  0.021989250000 },
      { 0.290400000000,  0.954000000000,  0.020300000000 },
      { 0.303891200000,  0.960256100000,  0.018718050000 },
      { 0.317572600000,  0.966007400000,  0.017240360000 },
      { 0.331438400000,  0.971260600000,  0.015863640000 },
      { 0.345482800000,  0.976022500000,  0.014584610000 },
      { 0.359700000000,  0.980300000000,  0.013400000000 },
      { 0.374083900000,  0.984092400000,  0.012307230000 },
      { 0.388639600000,  0.987418200000,  0.011301880000 },
      { 0.403378400000,  0.990312800000,  0.010377920000 },
      { 0.418311500000,  0.992811600000,  0.009529306000 },
      { 0.433449900000,  0.994950100000,  0.008749999000 },
      { 0.448795300000,  0.996710800000,  0.008035200000 },
      { 0.464336000000,  0.998098300000,  0.007381600000 },
      { 0.480064000000,  0.999112000000,  0.006785400000 },
      { 0.495971300000,  0.999748200000,  0.006242800000 },
      { 0.512050100000,  1.000000000000,  0.005749999000 },
      { 0.528295900000,  0.999856700000,  0.005303600000 },
      { 0.544691600000,  0.999304600000,  0.004899800000 },
      { 0.561209400000,  0.998325500000,  0.004534200000 },
      { 0.577821500000,  0.996898700000,  0.004202400000 },
      { 0.594500000000,  0.995000000000,  0.003900000000 },
      { 0.611220900000,  0.992600500000,  0.003623200000 },
      { 0.627975800000,  0.989742600000,  0.003370600000 },
      { 0.644760200000,  0.986444400000,  0.003141400000 },
      { 0.661569700000,  0.982724100000,  0.002934800000 },
      { 0.678400000000,  0.978600000000,  0.002749999000 },
      { 0.695239200000,  0.974083700000,  0.002585200000 },
      { 0.712058600000,  0.969171200000,  0.002438600000 },
      { 0.728828400000,  0.963856800000,  0.002309400000 },
      { 0.745518800000,  0.958134900000,  0.002196800000 },
      { 0.762100000000,  0.952000000000,  0.002100000000 },
      { 0.778543200000,  0.945450400000,  0.002017733000 },
      { 0.794825600000,  0.938499200000,  0.001948200000 },
      { 0.810926400000,  0.931162800000,  0.001889800000 },
      { 0.826824800000,  0.923457600000,  0.001840933000 },
      { 0.842500000000,  0.915400000000,  0.001800000000 },
      { 0.857932500000,  0.907006400000,  0.001766267000 },
      { 0.873081600000,  0.898277200000,  0.001737800000 },
      { 0.887894400000,  0.889204800000,  0.001711200000 },
      { 0.902318100000,  0.879781600000,  0.001683067000 },
      { 0.916300000000,  0.870000000000,  0.001650001000 },
      { 0.929799500000,  0.859861300000,  0.001610133000 },
      { 0.942798400000,  0.849392000000,  0.001564400000 },
      { 0.955277600000,  0.838622000000,  0.001513600000 },
      { 0.967217900000,  0.827581300000,  0.001458533000 },
      { 0.978600000000,  0.816300000000,  0.001400000000 },
      { 0.989385600000,  0.804794700000,  0.001336667000 },
      { 0.999548800000,  0.793082000000,  0.001270000000 },
      { 1.009089200000,  0.781192000000,  0.001205000000 },
      { 1.018006400000,  0.769154700000,  0.001146667000 },
      { 1.026300000000,  0.757000000000,  0.001100000000 },
      { 1.033982700000,  0.744754100000,  0.001068800000 },
      { 1.040986000000,  0.732422400000,  0.001049400000 },
      { 1.047188000000,  0.720003600000,  0.001035600000 },
      { 1.052466700000,  0.707496500000,  0.001021200000 },
      { 1.056700000000,  0.694900000000,  0.001000000000 },
      { 1.059794400000,  0.682219200000,  0.000968640000 },
      { 1.061799200000,  0.669471600000,  0.000929920000 },
      { 1.062806800000,  0.656674400000,  0.000886880000 },
      { 1.062909600000,  0.643844800000,  0.000842560000 },
      { 1.062200000000,  0.631000000000,  0.000800000000 },
      { 1.060735200000,  0.618155500000,  0.000760960000 },
      { 1.058443600000,  0.605314400000,  0.000723680000 },
      { 1.055224400000,  0.592475600000,  0.000685920000 },
      { 1.050976800000,  0.579637900000,  0.000645440000 },
      { 1.045600000000,  0.566800000000,  0.000600000000 },
      { 1.039036900000,  0.553961100000,  0.000547866700 },
      { 1.031360800000,  0.541137200000,  0.000491600000 },
      { 1.022666200000,  0.528352800000,  0.000435400000 },
      { 1.013047700000,  0.515632300000,  0.000383466700 },
      { 1.002600000000,  0.503000000000,  0.000340000000 },
      { 0.991367500000,  0.490468800000,  0.000307253300 },
      { 0.979331400000,  0.478030400000,  0.000283160000 },
      { 0.966491600000,  0.465677600000,  0.000265440000 },
      { 0.952847900000,  0.453403200000,  0.000251813300 },
      { 0.938400000000,  0.441200000000,  0.000240000000 },
      { 0.923194000000,  0.429080000000,  0.000229546700 },
      { 0.907244000000,  0.417036000000,  0.000220640000 },
      { 0.890502000000,  0.405032000000,  0.000211960000 },
      { 0.872920000000,  0.393032000000,  0.000202186700 },
      { 0.854449900000,  0.381000000000,  0.000190000000 },
      { 0.835084000000,  0.368918400000,  0.000174213300 },
      { 0.814946000000,  0.356827200000,  0.000155640000 },
      { 0.794186000000,  0.344776800000,  0.000135960000 },
      { 0.772954000000,  0.332817600000,  0.000116853300 },
      { 0.751400000000,  0.321000000000,  0.000100000000 },
      { 0.729583600000,  0.309338100000,  0.000086133330 },
      { 0.707588800000,  0.297850400000,  0.000074600000 },
      { 0.685602200000,  0.286593600000,  0.000065000000 },
      { 0.663810400000,  0.275624500000,  0.000056933330 },
      { 0.642400000000,  0.265000000000,  0.000049999990 },
      { 0.621514900000,  0.254763200000,  0.000044160000 },
      { 0.601113800000,  0.244889600000,  0.000039480000 },
      { 0.581105200000,  0.235334400000,  0.000035720000 },
      { 0.561397700000,  0.226052800000,  0.000032640000 },
      { 0.541900000000,  0.217000000000,  0.000030000000 },
      { 0.522599500000,  0.208161600000,  0.000027653330 },
      { 0.503546400000,  0.199548800000,  0.000025560000 },
      { 0.484743600000,  0.191155200000,  0.000023640000 },
      { 0.466193900000,  0.182974400000,  0.000021813330 },
      { 0.447900000000,  0.175000000000,  0.000020000000 },
      { 0.429861300000,  0.167223500000,  0.000018133330 },
      { 0.412098000000,  0.159646400000,  0.000016200000 },
      { 0.394644000000,  0.152277600000,  0.000014200000 },
      { 0.377533300000,  0.145125900000,  0.000012133330 },
      { 0.360800000000,  0.138200000000,  0.000010000000 },
      { 0.344456300000,  0.131500300000,  0.000007733333 },
      { 0.328516800000,  0.125024800000,  0.000005400000 },
      { 0.313019200000,  0.118779200000,  0.000003200000 },
      { 0.298001100000,  0.112769100000,  0.000001333333 },
      { 0.283500000000,  0.107000000000,  0.000000000000 },
      { 0.269544800000,  0.101476200000,  0.000000000000 },
      { 0.256118400000,  0.096188640000,  0.000000000000 },
      { 0.243189600000,  0.091122960000,  0.000000000000 },
      { 0.230727200000,  0.086264850000,  0.000000000000 },
      { 0.218700000000,  0.081600000000,  0.000000000000 },
      { 0.207097100000,  0.077120640000,  0.000000000000 },
      { 0.195923200000,  0.072825520000,  0.000000000000 },
      { 0.185170800000,  0.068710080000,  0.000000000000 },
      { 0.174832300000,  0.064769760000,  0.000000000000 },
      { 0.164900000000,  0.061000000000,  0.000000000000 },
      { 0.155366700000,  0.057396210000,  0.000000000000 },
      { 0.146230000000,  0.053955040000,  0.000000000000 },
      { 0.137490000000,  0.050673760000,  0.000000000000 },
      { 0.129146700000,  0.047549650000,  0.000000000000 },
      { 0.121200000000,  0.044580000000,  0.000000000000 },
      { 0.113639700000,  0.041758720000,  0.000000000000 },
      { 0.106465000000,  0.039084960000,  0.000000000000 },
      { 0.099690440000,  0.036563840000,  0.000000000000 },
      { 0.093330610000,  0.034200480000,  0.000000000000 },
      { 0.087400000000,  0.032000000000,  0.000000000000 },
      { 0.081900960000,  0.029962610000,  0.000000000000 },
      { 0.076804280000,  0.028076640000,  0.000000000000 },
      { 0.072077120000,  0.026329360000,  0.000000000000 },
      { 0.067686640000,  0.024708050000,  0.000000000000 },
      { 0.063600000000,  0.023200000000,  0.000000000000 },
      { 0.059806850000,  0.021800770000,  0.000000000000 },
      { 0.056282160000,  0.020501120000,  0.000000000000 },
      { 0.052971040000,  0.019281080000,  0.000000000000 },
      { 0.049818610000,  0.018120690000,  0.000000000000 },
      { 0.046770000000,  0.017000000000,  0.000000000000 },
      { 0.043784050000,  0.015903790000,  0.000000000000 },
      { 0.040875360000,  0.014837180000,  0.000000000000 },
      { 0.038072640000,  0.013810680000,  0.000000000000 },
      { 0.035404610000,  0.012834780000,  0.000000000000 },
      { 0.032900000000,  0.011920000000,  0.000000000000 },
      { 0.030564190000,  0.011068310000,  0.000000000000 },
      { 0.028380560000,  0.010273390000,  0.000000000000 },
      { 0.026344840000,  0.009533311000,  0.000000000000 },
      { 0.024452750000,  0.008846157000,  0.000000000000 },
      { 0.022700000000,  0.008210000000,  0.000000000000 },
      { 0.021084290000,  0.007623781000,  0.000000000000 },
      { 0.019599880000,  0.007085424000,  0.000000000000 },
      { 0.018237320000,  0.006591476000,  0.000000000000 },
      { 0.016987170000,  0.006138485000,  0.000000000000 },
      { 0.015840000000,  0.005723000000,  0.000000000000 },
      { 0.014790640000,  0.005343059000,  0.000000000000 },
      { 0.013831320000,  0.004995796000,  0.000000000000 },
      { 0.012948680000,  0.004676404000,  0.000000000000 },
      { 0.012129200000,  0.004380075000,  0.000000000000 },
      { 0.011359160000,  0.004102000000,  0.000000000000 },
      { 0.010629350000,  0.003838453000,  0.000000000000 },
      { 0.009938846000,  0.003589099000,  0.000000000000 },
      { 0.009288422000,  0.003354219000,  0.000000000000 },
      { 0.008678854000,  0.003134093000,  0.000000000000 },
      { 0.008110916000,  0.002929000000,  0.000000000000 },
      { 0.007582388000,  0.002738139000,  0.000000000000 },
      { 0.007088746000,  0.002559876000,  0.000000000000 },
      { 0.006627313000,  0.002393244000,  0.000000000000 },
      { 0.006195408000,  0.002237275000,  0.000000000000 },
      { 0.005790346000,  0.002091000000,  0.000000000000 },
      { 0.005409826000,  0.001953587000,  0.000000000000 },
      { 0.005052583000,  0.001824580000,  0.000000000000 },
      { 0.004717512000,  0.001703580000,  0.000000000000 },
      { 0.004403507000,  0.001590187000,  0.000000000000 },
      { 0.004109457000,  0.001484000000,  0.000000000000 },
      { 0.003833913000,  0.001384496000,  0.000000000000 },
      { 0.003575748000,  0.001291268000,  0.000000000000 },
      { 0.003334342000,  0.001204092000,  0.000000000000 },
      { 0.003109075000,  0.001122744000,  0.000000000000 },
      { 0.002899327000,  0.001047000000,  0.000000000000 },
      { 0.002704348000,  0.000976589600,  0.000000000000 },
      { 0.002523020000,  0.000911108800,  0.000000000000 },
      { 0.002354168000,  0.000850133200,  0.000000000000 },
      { 0.002196616000,  0.000793238400,  0.000000000000 },
      { 0.002049190000,  0.000740000000,  0.000000000000 },
      { 0.001910960000,  0.000690082700,  0.000000000000 },
      { 0.001781438000,  0.000643310000,  0.000000000000 },
      { 0.001660110000,  0.000599496000,  0.000000000000 },
      { 0.001546459000,  0.000558454700,  0.000000000000 },
      { 0.001439971000,  0.000520000000,  0.000000000000 },
      { 0.001340042000,  0.000483913600,  0.000000000000 },
      { 0.001246275000,  0.000450052800,  0.000000000000 },
      { 0.001158471000,  0.000418345200,  0.000000000000 },
      { 0.001076430000,  0.000388718400,  0.000000000000 },
      { 0.000999949300,  0.000361100000,  0.000000000000 },
      { 0.000928735800,  0.000335383500,  0.000000000000 },
      { 0.000862433200,  0.000311440400,  0.000000000000 },
      { 0.000800750300,  0.000289165600,  0.000000000000 },
      { 0.000743396000,  0.000268453900,  0.000000000000 },
      { 0.000690078600,  0.000249200000,  0.000000000000 },
      { 0.000640515600,  0.000231301900,  0.000000000000 },
      { 0.000594502100,  0.000214685600,  0.000000000000 },
      { 0.000551864600,  0.000199288400,  0.000000000000 },
      { 0.000512429000,  0.000185047500,  0.000000000000 },
      { 0.000476021300,  0.000171900000,  0.000000000000 },
      { 0.000442453600,  0.000159778100,  0.000000000000 },
      { 0.000411511700,  0.000148604400,  0.000000000000 },
      { 0.000382981400,  0.000138301600,  0.000000000000 },
      { 0.000356649100,  0.000128792500,  0.000000000000 },
      { 0.000332301100,  0.000120000000,  0.000000000000 },
      { 0.000309758600,  0.000111859500,  0.000000000000 },
      { 0.000288887100,  0.000104322400,  0.000000000000 },
      { 0.000269539400,  0.000097335600,  0.000000000000 },
      { 0.000251568200,  0.000090845870,  0.000000000000 },
      { 0.000234826100,  0.000084800000,  0.000000000000 },
      { 0.000219171000,  0.000079146670,  0.000000000000 },
      { 0.000204525800,  0.000073858000,  0.000000000000 },
      { 0.000190840500,  0.000068916000,  0.000000000000 },
      { 0.000178065400,  0.000064302670,  0.000000000000 },
      { 0.000166150500,  0.000060000000,  0.000000000000 },
      { 0.000155023600,  0.000055981870,  0.000000000000 },
      { 0.000144621900,  0.000052225600,  0.000000000000 },
      { 0.000134909800,  0.000048718400,  0.000000000000 },
      { 0.000125852000,  0.000045447470,  0.000000000000 },
      { 0.000117413000,  0.000042400000,  0.000000000000 },
      { 0.000109551500,  0.000039561040,  0.000000000000 },
      { 0.000102224500,  0.000036915120,  0.000000000000 },
      { 0.000095394450,  0.000034448680,  0.000000000000 },
      { 0.000089023900,  0.000032148160,  0.000000000000 },
      { 0.000083075270,  0.000030000000,  0.000000000000 },
      { 0.000077512690,  0.000027991250,  0.000000000000 },
      { 0.000072313040,  0.000026113560,  0.000000000000 },
      { 0.000067457780,  0.000024360240,  0.000000000000 },
      { 0.000062928440,  0.000022724610,  0.000000000000 },
      { 0.000058706520,  0.000021200000,  0.000000000000 },
      { 0.000054770280,  0.000019778550,  0.000000000000 },
      { 0.000051099180,  0.000018452850,  0.000000000000 },
      { 0.000047676540,  0.000017216870,  0.000000000000 },
      { 0.000044485670,  0.000016064590,  0.000000000000 },
      { 0.000041509940,  0.000014990000,  0.000000000000 },
      { 0.000038733240,  0.000013987280,  0.000000000000 },
      { 0.000036142030,  0.000013051550,  0.000000000000 },
      { 0.000033723520,  0.000012178180,  0.000000000000 },
      { 0.000031464870,  0.000011362540,  0.000000000000 },
      { 0.000029353260,  0.000010600000,  0.000000000000 },
      { 0.000027375730,  0.000009885877,  0.000000000000 },
      { 0.000025524330,  0.000009217304,  0.000000000000 },
      { 0.000023793760,  0.000008592362,  0.000000000000 },
      { 0.000022178700,  0.000008009133,  0.000000000000 },
      { 0.000020673830,  0.000007465700,  0.000000000000 },
      { 0.000019272260,  0.000006959567,  0.000000000000 },
      { 0.000017966400,  0.000006487995,  0.000000000000 },
      { 0.000016749910,  0.000006048699,  0.000000000000 },
      { 0.000015616480,  0.000005639396,  0.000000000000 },
      { 0.000014559770,  0.000005257800,  0.000000000000 },
      { 0.000013573870,  0.000004901771,  0.000000000000 },
      { 0.000012654360,  0.000004569720,  0.000000000000 },
      { 0.000011797230,  0.000004260194,  0.000000000000 },
      { 0.000010998440,  0.000003971739,  0.000000000000 },
      { 0.000010253980,  0.000003702900,  0.000000000000 },
      { 0.000009559646,  0.000003452163,  0.000000000000 },
      { 0.000008912044,  0.000003218302,  0.000000000000 },
      { 0.000008308358,  0.000003000300,  0.000000000000 },
      { 0.000007745769,  0.000002797139,  0.000000000000 },
      { 0.000007221456,  0.000002607800,  0.000000000000 },
      { 0.000006732475,  0.000002431220,  0.000000000000 },
      { 0.000006276423,  0.000002266531,  0.000000000000 },
      { 0.000005851304,  0.000002113013,  0.000000000000 },
      { 0.000005455118,  0.000001969943,  0.000000000000 },
      { 0.000005085868,  0.000001836600,  0.000000000000 },
      { 0.000004741466,  0.000001712230,  0.000000000000 },
      { 0.000004420236,  0.000001596228,  0.000000000000 },
      { 0.000004120783,  0.000001488090,  0.000000000000 },
      { 0.000003841716,  0.000001387314,  0.000000000000 },
      { 0.000003581652,  0.000001293400,  0.000000000000 },
      { 0.000003339127,  0.000001205820,  0.000000000000 },
      { 0.000003112949,  0.000001124143,  0.000000000000 },
      { 0.000002902121,  0.000001048009,  0.000000000000 },
      { 0.000002705645,  0.000000977058,  0.000000000000 },
      { 0.000002522525,  0.000000910930,  0.000000000000 },
      { 0.000002351726,  0.000000849251,  0.000000000000 },
      { 0.000002192415,  0.000000791721,  0.000000000000 },
      { 0.000002043902,  0.000000738090,  0.000000000000 },
      { 0.000001905497,  0.000000688110,  0.000000000000 },
      { 0.000001776509,  0.000000641530,  0.000000000000 },
      { 0.000001656215,  0.000000598090,  0.000000000000 },
      { 0.000001544022,  0.000000557575,  0.000000000000 },
      { 0.000001439440,  0.000000519808,  0.000000000000 },
      { 0.000001341977,  0.000000484612,  0.000000000000 },
      { 0.000001251141,  0.000000451810,  0.000000000000 }
    };
  
    wcl_uint32 const CIE1964_CMF_1NM_BEGIN_WAVELENGTH = 360;
    wcl_uint32 const CIE1964_CMF_1NM_END_WAVELENGTH = 830;
  
    wcl_double const cie1964_cmf_1nm_table[
      CIE1964_CMF_1NM_END_WAVELENGTH - 
      CIE1964_CMF_1NM_BEGIN_WAVELENGTH + 1
                                           ][3] =
    {
      { 0.000000122200,  0.000000013398,  0.000000535027 },
      { 0.000000185138,  0.000000020294,  0.000000810720 },
      { 0.000000278830,  0.000000030560,  0.000001221200 },
      { 0.000000417470,  0.000000045740,  0.000001828700 },
      { 0.000000621330,  0.000000068050,  0.000002722200 },
      { 0.000000919270,  0.000000100650,  0.000004028300 },
      { 0.000001351980,  0.000000147980,  0.000005925700 },
      { 0.000001976540,  0.000000216270,  0.000008665100 },
      { 0.000002872500,  0.000000314200,  0.000012596000 },
      { 0.000004149500,  0.000000453700,  0.000018201000 },
      { 0.000005958600,  0.000000651100,  0.000026143700 },
      { 0.000008505600,  0.000000928800,  0.000037330000 },
      { 0.000012068600,  0.000001317500,  0.000052987000 },
      { 0.000017022600,  0.000001857200,  0.000074764000 },
      { 0.000023868000,  0.000002602000,  0.000104870000 },
      { 0.000033266000,  0.000003625000,  0.000146220000 },
      { 0.000046087000,  0.000005019000,  0.000202660000 },
      { 0.000063472000,  0.000006907000,  0.000279230000 },
      { 0.000086892000,  0.000009449000,  0.000382450000 },
      { 0.000118246000,  0.000012848000,  0.000520720000 },
      { 0.000159952000,  0.000017364000,  0.000704776000 },
      { 0.000215080000,  0.000023327000,  0.000948230000 },
      { 0.000287490000,  0.000031150000,  0.001268200000 },
      { 0.000381990000,  0.000041350000,  0.001686100000 },
      { 0.000504550000,  0.000054560000,  0.002228500000 },
      { 0.000662440000,  0.000071560000,  0.002927800000 },
      { 0.000864500000,  0.000093300000,  0.003823700000 },
      { 0.001121500000,  0.000120870000,  0.004964200000 },
      { 0.001446160000,  0.000155640000,  0.006406700000 },
      { 0.001853590000,  0.000199200000,  0.008219300000 },
      { 0.002361600000,  0.000253400000,  0.010482200000 },
      { 0.002990600000,  0.000320200000,  0.013289000000 },
      { 0.003764500000,  0.000402400000,  0.016747000000 },
      { 0.004710200000,  0.000502300000,  0.020980000000 },
      { 0.005858100000,  0.000623200000,  0.026127000000 },
      { 0.007242300000,  0.000768500000,  0.032344000000 },
      { 0.008899600000,  0.000941700000,  0.039802000000 },
      { 0.010870900000,  0.001147800000,  0.048691000000 },
      { 0.013198900000,  0.001390300000,  0.059210000000 },
      { 0.015929200000,  0.001674000000,  0.071576000000 },
      { 0.019109700000,  0.002004400000,  0.086010900000 },
      { 0.022788000000,  0.002386000000,  0.102740000000 },
      { 0.027011000000,  0.002822000000,  0.122000000000 },
      { 0.031829000000,  0.003319000000,  0.144020000000 },
      { 0.037278000000,  0.003880000000,  0.168990000000 },
      { 0.043400000000,  0.004509000000,  0.197120000000 },
      { 0.050223000000,  0.005209000000,  0.228570000000 },
      { 0.057764000000,  0.005985000000,  0.263470000000 },
      { 0.066038000000,  0.006833000000,  0.301900000000 },
      { 0.075033000000,  0.007757000000,  0.343870000000 },
      { 0.084736000000,  0.008756000000,  0.389366000000 },
      { 0.095041000000,  0.009816000000,  0.437970000000 },
      { 0.105836000000,  0.010918000000,  0.489220000000 },
      { 0.117066000000,  0.012058000000,  0.542900000000 },
      { 0.128682000000,  0.013237000000,  0.598810000000 },
      { 0.140638000000,  0.014456000000,  0.656760000000 },
      { 0.152893000000,  0.015717000000,  0.716580000000 },
      { 0.165416000000,  0.017025000000,  0.778120000000 },
      { 0.178191000000,  0.018399000000,  0.841310000000 },
      { 0.191214000000,  0.019848000000,  0.906110000000 },
      { 0.204492000000,  0.021391000000,  0.972542000000 },
      { 0.217650000000,  0.022992000000,  1.038900000000 },
      { 0.230267000000,  0.024598000000,  1.103100000000 },
      { 0.242311000000,  0.026213000000,  1.165100000000 },
      { 0.253793000000,  0.027841000000,  1.224900000000 },
      { 0.264737000000,  0.029497000000,  1.282500000000 },
      { 0.275195000000,  0.031195000000,  1.338200000000 },
      { 0.285301000000,  0.032927000000,  1.392600000000 },
      { 0.295143000000,  0.034738000000,  1.446100000000 },
      { 0.304869000000,  0.036654000000,  1.499400000000 },
      { 0.314679000000,  0.038676000000,  1.553480000000 },
      { 0.324355000000,  0.040792000000,  1.607200000000 },
      { 0.333570000000,  0.042946000000,  1.658900000000 },
      { 0.342243000000,  0.045114000000,  1.708200000000 },
      { 0.350312000000,  0.047333000000,  1.754800000000 },
      { 0.357719000000,  0.049602000000,  1.798500000000 },
      { 0.364482000000,  0.051934000000,  1.839200000000 },
      { 0.370493000000,  0.054337000000,  1.876600000000 },
      { 0.375727000000,  0.056822000000,  1.910500000000 },
      { 0.380158000000,  0.059399000000,  1.940800000000 },
      { 0.383734000000,  0.062077000000,  1.967280000000 },
      { 0.386327000000,  0.064737000000,  1.989100000000 },
      { 0.387858000000,  0.067285000000,  2.005700000000 },
      { 0.388396000000,  0.069764000000,  2.017400000000 },
      { 0.387978000000,  0.072218000000,  2.024400000000 },
      { 0.386726000000,  0.074704000000,  2.027300000000 },
      { 0.384696000000,  0.077272000000,  2.026400000000 },
      { 0.382006000000,  0.079979000000,  2.022300000000 },
      { 0.378709000000,  0.082874000000,  2.015300000000 },
      { 0.374915000000,  0.086000000000,  2.006000000000 },
      { 0.370702000000,  0.089456000000,  1.994800000000 },
      { 0.366089000000,  0.092947000000,  1.981400000000 },
      { 0.361045000000,  0.096275000000,  1.965300000000 },
      { 0.355518000000,  0.099535000000,  1.946400000000 },
      { 0.349486000000,  0.102829000000,  1.924800000000 },
      { 0.342957000000,  0.106256000000,  1.900700000000 },
      { 0.335893000000,  0.109901000000,  1.874100000000 },
      { 0.328284000000,  0.113835000000,  1.845100000000 },
      { 0.320150000000,  0.118167000000,  1.813900000000 },
      { 0.311475000000,  0.122932000000,  1.780600000000 },
      { 0.302273000000,  0.128201000000,  1.745370000000 },
      { 0.292858000000,  0.133457000000,  1.709100000000 },
      { 0.283502000000,  0.138323000000,  1.672300000000 },
      { 0.274044000000,  0.143042000000,  1.634700000000 },
      { 0.264263000000,  0.147787000000,  1.595600000000 },
      { 0.254085000000,  0.152761000000,  1.554900000000 },
      { 0.243392000000,  0.158102000000,  1.512200000000 },
      { 0.232187000000,  0.163941000000,  1.467300000000 },
      { 0.220488000000,  0.170362000000,  1.419900000000 },
      { 0.208198000000,  0.177425000000,  1.370000000000 },
      { 0.195618000000,  0.185190000000,  1.317560000000 },
      { 0.183034000000,  0.193025000000,  1.262400000000 },
      { 0.170222000000,  0.200313000000,  1.205000000000 },
      { 0.157348000000,  0.207156000000,  1.146600000000 },
      { 0.144650000000,  0.213644000000,  1.088000000000 },
      { 0.132349000000,  0.219940000000,  1.030200000000 },
      { 0.120584000000,  0.226170000000,  0.973830000000 },
      { 0.109456000000,  0.232467000000,  0.919430000000 },
      { 0.099042000000,  0.239025000000,  0.867460000000 },
      { 0.089388000000,  0.245997000000,  0.818280000000 },
      { 0.080507000000,  0.253589000000,  0.772125000000 },
      { 0.072034000000,  0.261876000000,  0.728290000000 },
      { 0.063710000000,  0.270643000000,  0.686040000000 },
      { 0.055694000000,  0.279645000000,  0.645530000000 },
      { 0.048117000000,  0.288694000000,  0.606850000000 },
      { 0.041072000000,  0.297665000000,  0.570060000000 },
      { 0.034642000000,  0.306469000000,  0.535220000000 },
      { 0.028896000000,  0.315035000000,  0.502340000000 },
      { 0.023876000000,  0.323335000000,  0.471400000000 },
      { 0.019628000000,  0.331366000000,  0.442390000000 },
      { 0.016172000000,  0.339133000000,  0.415254000000 },
      { 0.013300000000,  0.347860000000,  0.390024000000 },
      { 0.010759000000,  0.358326000000,  0.366399000000 },
      { 0.008542000000,  0.370001000000,  0.344015000000 },
      { 0.006661000000,  0.382464000000,  0.322689000000 },
      { 0.005132000000,  0.395379000000,  0.302356000000 },
      { 0.003982000000,  0.408482000000,  0.283036000000 },
      { 0.003239000000,  0.421588000000,  0.264816000000 },
      { 0.002934000000,  0.434619000000,  0.247848000000 },
      { 0.003114000000,  0.447601000000,  0.232318000000 },
      { 0.003816000000,  0.460777000000,  0.218502000000 },
      { 0.005095000000,  0.474340000000,  0.205851000000 },
      { 0.006936000000,  0.488200000000,  0.193596000000 },
      { 0.009299000000,  0.502340000000,  0.181736000000 },
      { 0.012147000000,  0.516740000000,  0.170281000000 },
      { 0.015444000000,  0.531360000000,  0.159249000000 },
      { 0.019156000000,  0.546190000000,  0.148673000000 },
      { 0.023250000000,  0.561180000000,  0.138609000000 },
      { 0.027690000000,  0.576290000000,  0.129096000000 },
      { 0.032444000000,  0.591500000000,  0.120215000000 },
      { 0.037465000000,  0.606741000000,  0.112044000000 },
      { 0.042956000000,  0.622150000000,  0.104710000000 },
      { 0.049114000000,  0.637830000000,  0.098196000000 },
      { 0.055920000000,  0.653710000000,  0.092361000000 },
      { 0.063349000000,  0.669680000000,  0.087088000000 },
      { 0.071358000000,  0.685660000000,  0.082248000000 },
      { 0.079901000000,  0.701550000000,  0.077744000000 },
      { 0.088909000000,  0.717230000000,  0.073456000000 },
      { 0.098293000000,  0.732570000000,  0.069268000000 },
      { 0.107949000000,  0.747460000000,  0.065060000000 },
      { 0.117749000000,  0.761757000000,  0.060709000000 },
      { 0.127839000000,  0.775340000000,  0.056457000000 },
      { 0.138450000000,  0.788220000000,  0.052609000000 },
      { 0.149516000000,  0.800460000000,  0.049122000000 },
      { 0.161041000000,  0.812140000000,  0.045954000000 },
      { 0.172953000000,  0.823330000000,  0.043050000000 },
      { 0.185209000000,  0.834120000000,  0.040368000000 },
      { 0.197755000000,  0.844600000000,  0.037839000000 },
      { 0.210538000000,  0.854870000000,  0.035384000000 },
      { 0.223460000000,  0.865040000000,  0.032949000000 },
      { 0.236491000000,  0.875211000000,  0.030451000000 },
      { 0.249633000000,  0.885370000000,  0.028029000000 },
      { 0.262972000000,  0.895370000000,  0.025862000000 },
      { 0.276515000000,  0.905150000000,  0.023920000000 },
      { 0.290269000000,  0.914650000000,  0.022174000000 },
      { 0.304213000000,  0.923810000000,  0.020584000000 },
      { 0.318361000000,  0.932550000000,  0.019127000000 },
      { 0.332705000000,  0.940810000000,  0.017740000000 },
      { 0.347232000000,  0.948520000000,  0.016403000000 },
      { 0.361926000000,  0.955600000000,  0.015064000000 },
      { 0.376772000000,  0.961988000000,  0.013676000000 },
      { 0.391683000000,  0.967540000000,  0.012308000000 },
      { 0.406594000000,  0.972230000000,  0.011056000000 },
      { 0.421539000000,  0.976170000000,  0.009915000000 },
      { 0.436517000000,  0.979460000000,  0.008872000000 },
      { 0.451584000000,  0.982200000000,  0.007918000000 },
      { 0.466782000000,  0.984520000000,  0.007030000000 },
      { 0.482147000000,  0.986520000000,  0.006223000000 },
      { 0.497738000000,  0.988320000000,  0.005453000000 },
      { 0.513606000000,  0.990020000000,  0.004714000000 },
      { 0.529826000000,  0.991761000000,  0.003988000000 },
      { 0.546440000000,  0.993530000000,  0.003289000000 },
      { 0.563426000000,  0.995230000000,  0.002646000000 },
      { 0.580726000000,  0.996770000000,  0.002063000000 },
      { 0.598290000000,  0.998090000000,  0.001533000000 },
      { 0.616053000000,  0.999110000000,  0.001091000000 },
      { 0.633948000000,  0.999770000000,  0.000711000000 },
      { 0.651901000000,  1.000000000000,  0.000407000000 },
      { 0.669824000000,  0.999710000000,  0.000184000000 },
      { 0.687632000000,  0.998850000000,  0.000047000000 },
      { 0.705224000000,  0.997340000000,  0.000000000000 },
      { 0.722773000000,  0.995260000000,  0.000000000000 },
      { 0.740483000000,  0.992740000000,  0.000000000000 },
      { 0.758273000000,  0.989750000000,  0.000000000000 },
      { 0.776083000000,  0.986300000000,  0.000000000000 },
      { 0.793832000000,  0.982380000000,  0.000000000000 },
      { 0.811436000000,  0.977980000000,  0.000000000000 },
      { 0.828822000000,  0.973110000000,  0.000000000000 },
      { 0.845879000000,  0.967740000000,  0.000000000000 },
      { 0.862525000000,  0.961890000000,  0.000000000000 },
      { 0.878655000000,  0.955552000000,  0.000000000000 },
      { 0.894208000000,  0.948601000000,  0.000000000000 },
      { 0.909206000000,  0.940981000000,  0.000000000000 },
      { 0.923672000000,  0.932798000000,  0.000000000000 },
      { 0.937638000000,  0.924158000000,  0.000000000000 },
      { 0.951162000000,  0.915175000000,  0.000000000000 },
      { 0.964283000000,  0.905954000000,  0.000000000000 },
      { 0.977068000000,  0.896608000000,  0.000000000000 },
      { 0.989590000000,  0.887249000000,  0.000000000000 },
      { 1.001910000000,  0.877986000000,  0.000000000000 },
      { 1.014160000000,  0.868934000000,  0.000000000000 },
      { 1.026500000000,  0.860164000000,  0.000000000000 },
      { 1.038800000000,  0.851519000000,  0.000000000000 },
      { 1.051000000000,  0.842963000000,  0.000000000000 },
      { 1.062900000000,  0.834393000000,  0.000000000000 },
      { 1.074300000000,  0.825623000000,  0.000000000000 },
      { 1.085200000000,  0.816764000000,  0.000000000000 },
      { 1.095200000000,  0.807544000000,  0.000000000000 },
      { 1.104200000000,  0.797947000000,  0.000000000000 },
      { 1.112000000000,  0.787893000000,  0.000000000000 },
      { 1.118520000000,  0.777405000000,  0.000000000000 },
      { 1.123800000000,  0.766490000000,  0.000000000000 },
      { 1.128000000000,  0.755309000000,  0.000000000000 },
      { 1.131100000000,  0.743845000000,  0.000000000000 },
      { 1.133200000000,  0.732190000000,  0.000000000000 },
      { 1.134300000000,  0.720353000000,  0.000000000000 },
      { 1.134300000000,  0.708281000000,  0.000000000000 },
      { 1.133300000000,  0.696055000000,  0.000000000000 },
      { 1.131200000000,  0.683621000000,  0.000000000000 },
      { 1.128100000000,  0.671048000000,  0.000000000000 },
      { 1.123990000000,  0.658341000000,  0.000000000000 },
      { 1.118900000000,  0.645545000000,  0.000000000000 },
      { 1.112900000000,  0.632718000000,  0.000000000000 },
      { 1.105900000000,  0.619815000000,  0.000000000000 },
      { 1.098000000000,  0.606887000000,  0.000000000000 },
      { 1.089100000000,  0.593878000000,  0.000000000000 },
      { 1.079200000000,  0.580781000000,  0.000000000000 },
      { 1.068400000000,  0.567653000000,  0.000000000000 },
      { 1.056700000000,  0.554490000000,  0.000000000000 },
      { 1.044000000000,  0.541228000000,  0.000000000000 },
      { 1.030480000000,  0.527963000000,  0.000000000000 },
      { 1.016000000000,  0.514634000000,  0.000000000000 },
      { 1.000800000000,  0.501363000000,  0.000000000000 },
      { 0.984790000000,  0.488124000000,  0.000000000000 },
      { 0.968080000000,  0.474935000000,  0.000000000000 },
      { 0.950740000000,  0.461834000000,  0.000000000000 },
      { 0.932800000000,  0.448823000000,  0.000000000000 },
      { 0.914340000000,  0.435917000000,  0.000000000000 },
      { 0.895390000000,  0.423153000000,  0.000000000000 },
      { 0.876030000000,  0.410526000000,  0.000000000000 },
      { 0.856297000000,  0.398057000000,  0.000000000000 },
      { 0.836350000000,  0.385835000000,  0.000000000000 },
      { 0.816290000000,  0.373951000000,  0.000000000000 },
      { 0.796050000000,  0.362311000000,  0.000000000000 },
      { 0.775610000000,  0.350863000000,  0.000000000000 },
      { 0.754930000000,  0.339554000000,  0.000000000000 },
      { 0.733990000000,  0.328309000000,  0.000000000000 },
      { 0.712780000000,  0.317118000000,  0.000000000000 },
      { 0.691290000000,  0.305936000000,  0.000000000000 },
      { 0.669520000000,  0.294737000000,  0.000000000000 },
      { 0.647467000000,  0.283493000000,  0.000000000000 },
      { 0.625110000000,  0.272222000000,  0.000000000000 },
      { 0.602520000000,  0.260990000000,  0.000000000000 },
      { 0.579890000000,  0.249877000000,  0.000000000000 },
      { 0.557370000000,  0.238946000000,  0.000000000000 },
      { 0.535110000000,  0.228254000000,  0.000000000000 },
      { 0.513240000000,  0.217853000000,  0.000000000000 },
      { 0.491860000000,  0.207780000000,  0.000000000000 },
      { 0.471080000000,  0.198072000000,  0.000000000000 },
      { 0.450960000000,  0.188748000000,  0.000000000000 },
      { 0.431567000000,  0.179828000000,  0.000000000000 },
      { 0.412870000000,  0.171285000000,  0.000000000000 },
      { 0.394750000000,  0.163059000000,  0.000000000000 },
      { 0.377210000000,  0.155151000000,  0.000000000000 },
      { 0.360190000000,  0.147535000000,  0.000000000000 },
      { 0.343690000000,  0.140211000000,  0.000000000000 },
      { 0.327690000000,  0.133170000000,  0.000000000000 },
      { 0.312170000000,  0.126400000000,  0.000000000000 },
      { 0.297110000000,  0.119892000000,  0.000000000000 },
      { 0.282500000000,  0.113640000000,  0.000000000000 },
      { 0.268329000000,  0.107633000000,  0.000000000000 },
      { 0.254590000000,  0.101870000000,  0.000000000000 },
      { 0.241300000000,  0.096347000000,  0.000000000000 },
      { 0.228480000000,  0.091063000000,  0.000000000000 },
      { 0.216140000000,  0.086010000000,  0.000000000000 },
      { 0.204300000000,  0.081187000000,  0.000000000000 },
      { 0.192950000000,  0.076583000000,  0.000000000000 },
      { 0.182110000000,  0.072198000000,  0.000000000000 },
      { 0.171770000000,  0.068024000000,  0.000000000000 },
      { 0.161920000000,  0.064052000000,  0.000000000000 },
      { 0.152568000000,  0.060281000000,  0.000000000000 },
      { 0.143670000000,  0.056697000000,  0.000000000000 },
      { 0.135200000000,  0.053292000000,  0.000000000000 },
      { 0.127130000000,  0.050059000000,  0.000000000000 },
      { 0.119480000000,  0.046998000000,  0.000000000000 },
      { 0.112210000000,  0.044096000000,  0.000000000000 },
      { 0.105310000000,  0.041345000000,  0.000000000000 },
      { 0.098786000000,  0.038750700000,  0.000000000000 },
      { 0.092610000000,  0.036297800000,  0.000000000000 },
      { 0.086773000000,  0.033983200000,  0.000000000000 },
      { 0.081260600000,  0.031800400000,  0.000000000000 },
      { 0.076048000000,  0.029739500000,  0.000000000000 },
      { 0.071114000000,  0.027791800000,  0.000000000000 },
      { 0.066454000000,  0.025955100000,  0.000000000000 },
      { 0.062062000000,  0.024226300000,  0.000000000000 },
      { 0.057930000000,  0.022601700000,  0.000000000000 },
      { 0.054050000000,  0.021077900000,  0.000000000000 },
      { 0.050412000000,  0.019650500000,  0.000000000000 },
      { 0.047006000000,  0.018315300000,  0.000000000000 },
      { 0.043823000000,  0.017068600000,  0.000000000000 },
      { 0.040850800000,  0.015905100000,  0.000000000000 },
      { 0.038072000000,  0.014818300000,  0.000000000000 },
      { 0.035468000000,  0.013800800000,  0.000000000000 },
      { 0.033031000000,  0.012849500000,  0.000000000000 },
      { 0.030753000000,  0.011960700000,  0.000000000000 },
      { 0.028623000000,  0.011130300000,  0.000000000000 },
      { 0.026635000000,  0.010355500000,  0.000000000000 },
      { 0.024781000000,  0.009633200000,  0.000000000000 },
      { 0.023052000000,  0.008959900000,  0.000000000000 },
      { 0.021441000000,  0.008332400000,  0.000000000000 },
      { 0.019941300000,  0.007748800000,  0.000000000000 },
      { 0.018544000000,  0.007204600000,  0.000000000000 },
      { 0.017241000000,  0.006697500000,  0.000000000000 },
      { 0.016027000000,  0.006225100000,  0.000000000000 },
      { 0.014896000000,  0.005785000000,  0.000000000000 },
      { 0.013842000000,  0.005375100000,  0.000000000000 },
      { 0.012862000000,  0.004994100000,  0.000000000000 },
      { 0.011949000000,  0.004639200000,  0.000000000000 },
      { 0.011100000000,  0.004309300000,  0.000000000000 },
      { 0.010311000000,  0.004002800000,  0.000000000000 },
      { 0.009576880000,  0.003717740000,  0.000000000000 },
      { 0.008894000000,  0.003452620000,  0.000000000000 },
      { 0.008258100000,  0.003205830000,  0.000000000000 },
      { 0.007666400000,  0.002976230000,  0.000000000000 },
      { 0.007116300000,  0.002762810000,  0.000000000000 },
      { 0.006605200000,  0.002564560000,  0.000000000000 },
      { 0.006130600000,  0.002380480000,  0.000000000000 },
      { 0.005690300000,  0.002209710000,  0.000000000000 },
      { 0.005281900000,  0.002051320000,  0.000000000000 },
      { 0.004903300000,  0.001904490000,  0.000000000000 },
      { 0.004552630000,  0.001768470000,  0.000000000000 },
      { 0.004227500000,  0.001642360000,  0.000000000000 },
      { 0.003925800000,  0.001525350000,  0.000000000000 },
      { 0.003645700000,  0.001416720000,  0.000000000000 },
      { 0.003385900000,  0.001315950000,  0.000000000000 },
      { 0.003144700000,  0.001222390000,  0.000000000000 },
      { 0.002920800000,  0.001135550000,  0.000000000000 },
      { 0.002713000000,  0.001054940000,  0.000000000000 },
      { 0.002520200000,  0.000980140000,  0.000000000000 },
      { 0.002341100000,  0.000910660000,  0.000000000000 },
      { 0.002174960000,  0.000846190000,  0.000000000000 },
      { 0.002020600000,  0.000786290000,  0.000000000000 },
      { 0.001877300000,  0.000730680000,  0.000000000000 },
      { 0.001744100000,  0.000678990000,  0.000000000000 },
      { 0.001620500000,  0.000631010000,  0.000000000000 },
      { 0.001505700000,  0.000586440000,  0.000000000000 },
      { 0.001399200000,  0.000545110000,  0.000000000000 },
      { 0.001300400000,  0.000506720000,  0.000000000000 },
      { 0.001208700000,  0.000471110000,  0.000000000000 },
      { 0.001123600000,  0.000438050000,  0.000000000000 },
      { 0.001044760000,  0.000407410000,  0.000000000000 },
      { 0.000971560000,  0.000378962000,  0.000000000000 },
      { 0.000903600000,  0.000352543000,  0.000000000000 },
      { 0.000840480000,  0.000328001000,  0.000000000000 },
      { 0.000781870000,  0.000305208000,  0.000000000000 },
      { 0.000727450000,  0.000284041000,  0.000000000000 },
      { 0.000676900000,  0.000264375000,  0.000000000000 },
      { 0.000629960000,  0.000246109000,  0.000000000000 },
      { 0.000586370000,  0.000229143000,  0.000000000000 },
      { 0.000545870000,  0.000213376000,  0.000000000000 },
      { 0.000508258000,  0.000198730000,  0.000000000000 },
      { 0.000473300000,  0.000185115000,  0.000000000000 },
      { 0.000440800000,  0.000172454000,  0.000000000000 },
      { 0.000410580000,  0.000160678000,  0.000000000000 },
      { 0.000382490000,  0.000149730000,  0.000000000000 },
      { 0.000356380000,  0.000139550000,  0.000000000000 },
      { 0.000332110000,  0.000130086000,  0.000000000000 },
      { 0.000309550000,  0.000121290000,  0.000000000000 },
      { 0.000288580000,  0.000113106000,  0.000000000000 },
      { 0.000269090000,  0.000105501000,  0.000000000000 },
      { 0.000250969000,  0.000098428000,  0.000000000000 },
      { 0.000234130000,  0.000091853000,  0.000000000000 },
      { 0.000218470000,  0.000085738000,  0.000000000000 },
      { 0.000203910000,  0.000080048000,  0.000000000000 },
      { 0.000190350000,  0.000074751000,  0.000000000000 },
      { 0.000177730000,  0.000069819000,  0.000000000000 },
      { 0.000165970000,  0.000065222000,  0.000000000000 },
      { 0.000155020000,  0.000060939000,  0.000000000000 },
      { 0.000144800000,  0.000056942000,  0.000000000000 },
      { 0.000135280000,  0.000053217000,  0.000000000000 },
      { 0.000126390000,  0.000049737000,  0.000000000000 },
      { 0.000118100000,  0.000046491000,  0.000000000000 },
      { 0.000110370000,  0.000043464000,  0.000000000000 },
      { 0.000103150000,  0.000040635000,  0.000000000000 },
      { 0.000096427000,  0.000038000000,  0.000000000000 },
      { 0.000090151000,  0.000035540500,  0.000000000000 },
      { 0.000084294000,  0.000033244800,  0.000000000000 },
      { 0.000078830000,  0.000031100600,  0.000000000000 },
      { 0.000073729000,  0.000029099000,  0.000000000000 },
      { 0.000068969000,  0.000027230700,  0.000000000000 },
      { 0.000064525800,  0.000025486000,  0.000000000000 },
      { 0.000060376000,  0.000023856100,  0.000000000000 },
      { 0.000056500000,  0.000022333200,  0.000000000000 },
      { 0.000052880000,  0.000020910400,  0.000000000000 },
      { 0.000049498000,  0.000019580800,  0.000000000000 },
      { 0.000046339000,  0.000018338400,  0.000000000000 },
      { 0.000043389000,  0.000017177700,  0.000000000000 },
      { 0.000040634000,  0.000016093400,  0.000000000000 },
      { 0.000038060000,  0.000015080000,  0.000000000000 },
      { 0.000035657000,  0.000014133600,  0.000000000000 },
      { 0.000033411700,  0.000013249000,  0.000000000000 },
      { 0.000031315000,  0.000012422600,  0.000000000000 },
      { 0.000029355000,  0.000011649900,  0.000000000000 },
      { 0.000027524000,  0.000010927700,  0.000000000000 },
      { 0.000025811000,  0.000010251900,  0.000000000000 },
      { 0.000024209000,  0.000009619600,  0.000000000000 },
      { 0.000022711000,  0.000009028100,  0.000000000000 },
      { 0.000021308000,  0.000008474000,  0.000000000000 },
      { 0.000019994000,  0.000007954800,  0.000000000000 },
      { 0.000018764000,  0.000007468600,  0.000000000000 },
      { 0.000017611500,  0.000007012800,  0.000000000000 },
      { 0.000016532000,  0.000006585800,  0.000000000000 },
      { 0.000015521000,  0.000006185700,  0.000000000000 },
      { 0.000014574000,  0.000005810700,  0.000000000000 },
      { 0.000013686000,  0.000005459000,  0.000000000000 },
      { 0.000012855000,  0.000005129800,  0.000000000000 },
      { 0.000012075000,  0.000004820600,  0.000000000000 },
      { 0.000011345000,  0.000004531200,  0.000000000000 },
      { 0.000010659000,  0.000004259100,  0.000000000000 },
      { 0.000010017000,  0.000004004200,  0.000000000000 },
      { 0.000009413630,  0.000003764730,  0.000000000000 },
      { 0.000008847900,  0.000003539950,  0.000000000000 },
      { 0.000008317100,  0.000003329140,  0.000000000000 },
      { 0.000007819000,  0.000003131150,  0.000000000000 },
      { 0.000007351600,  0.000002945290,  0.000000000000 },
      { 0.000006913000,  0.000002770810,  0.000000000000 },
      { 0.000006501500,  0.000002607050,  0.000000000000 },
      { 0.000006115300,  0.000002453290,  0.000000000000 },
      { 0.000005752900,  0.000002308940,  0.000000000000 },
      { 0.000005412700,  0.000002173380,  0.000000000000 },
      { 0.000005093470,  0.000002046130,  0.000000000000 },
      { 0.000004793800,  0.000001926620,  0.000000000000 },
      { 0.000004512500,  0.000001814400,  0.000000000000 },
      { 0.000004248300,  0.000001708950,  0.000000000000 },
      { 0.000004000200,  0.000001609880,  0.000000000000 },
      { 0.000003767100,  0.000001516770,  0.000000000000 },
      { 0.000003548000,  0.000001429210,  0.000000000000 },
      { 0.000003342100,  0.000001346860,  0.000000000000 },
      { 0.000003148500,  0.000001269450,  0.000000000000 },
      { 0.000002966500,  0.000001196620,  0.000000000000 },
      { 0.000002795310,  0.000001128090,  0.000000000000 },
      { 0.000002634500,  0.000001063680,  0.000000000000 },
      { 0.000002483400,  0.000001003130,  0.000000000000 },
      { 0.000002341400,  0.000000946220,  0.000000000000 },
      { 0.000002207800,  0.000000892630,  0.000000000000 },
      { 0.000002082000,  0.000000842160,  0.000000000000 },
      { 0.000001963600,  0.000000794640,  0.000000000000 },
      { 0.000001851900,  0.000000749780,  0.000000000000 },
      { 0.000001746500,  0.000000707440,  0.000000000000 },
      { 0.000001647100,  0.000000667480,  0.000000000000 },
      { 0.000001553140,  0.000000629700,  0.000000000000 }
    };
  
    void
    spectrum_to_xyz(
      CieSpectrumFunc const spectrum_func,
      CieStd const cie_std,
      wcl_double * const x,
      wcl_double * const y,
      wcl_double * const z)
    {
      wcl_uint32 wavelength_start, wavelength_end;
      wcl_double const (*cmf_table)[3];

      switch (cie_std)
      {
      case CIE_STD_1931:
        wavelength_start = CIE1931_CMF_1NM_BEGIN_WAVELENGTH;
        wavelength_end = CIE1931_CMF_1NM_END_WAVELENGTH;
        cmf_table = &(cie1931_cmf_1nm_table[0]);
        break;
        
      case CIE_STD_1964:
        wavelength_start = CIE1964_CMF_1NM_BEGIN_WAVELENGTH;
        wavelength_end = CIE1964_CMF_1NM_END_WAVELENGTH;
        cmf_table = &(cie1964_cmf_1nm_table[0]);
        break;
        
      default:
        assert(0);
        
        wavelength_start = 0;
        wavelength_end = 0;
        cmf_table = 0;
        break;
      }
      
      wcl_double X = 0, Y = 0, Z = 0;
      
      for (wcl_uint32 wavelength = wavelength_start;
           wavelength != wavelength_end;
           ++wavelength)
      {
        wcl_double const E = (*spectrum_func)(static_cast<wcl_double>(wavelength));
        
        X += E * cmf_table[wavelength - wavelength_start][0];
        Y += E * cmf_table[wavelength - wavelength_start][1];
        Z += E * cmf_table[wavelength - wavelength_start][2];
      }
      
      wcl_double const XYZ = X + Y + Z;
      
      if (x != 0)
      {
        (*x) = X / XYZ;
      }

      if (y != 0)
      {
        (*y) = Y / XYZ;
      }

      if (z != 0)
      {
        (*z) = Z / XYZ;
      }
    }
  }
}
